//
// Created by 86136 on 2024/11/15.
//
#include <iostream>
#include <string>
#include <memory>
#include <utility>

using namespace std;

// Any类型：可以接收任意数据类型 (PIMPL设计模式)
class Any {
public:
    Any() = default;
    ~Any() = default;

    // 禁止左值的拷贝构造和赋值（unique_ptr）
    Any(const Any&) = delete;
    Any& operator=(const Any&) = delete;

    // 允许右值的拷贝构造和赋值
    Any(Any&&) = default;
    Any& operator=(Any&&) = default;

    // 该构造函数能让Any类型接收任意其他类型的数据
    template<typename T>
    Any(T data) : base_(std::make_unique<Derive<T>>(data)) {}

    // 把Any对象中存储的data数据提取出来
    template<typename T>
    T cast_() {
        // 怎么从base_中找到Derive对象再取出data成员变量
        // 基类指针 -> 派生类指针    RTTI
        // 判断<T>是否与类成员base中取得的数据类型相同
        Derive<T>* pd = dynamic_cast<Derive<T>*>(base_.get());
        if (pd == nullptr) {
            std::cerr << "type is unmatch!" << std::endl;
        }
        return pd->data_;
    }

private:
    // 基类类型
    class Base {
    public:
        virtual ~Base() = default;
    };

    // 派生类型
    template<typename T>
    class Derive : public Base {
    public:
        explicit Derive(T data) : data_(std::move(data)) {}
        T data_;
    };

    // 定义一个基类指针
    std::unique_ptr<Base> base_;
};

int main() {
    Any a = 1;
    cout << a.cast_<int>() << endl;
    a = string("abc");
    cout << a.cast_<string>() << endl;
}



